home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / System / lpDaemon SRC / Common Sources / CvtAddr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-31  |  2.6 KB  |  124 lines  |  [TEXT/MPS ]

  1. #include <MacTCPCommonTypes.h>
  2. #include <AddressXLation.h>
  3. #include <CvtAddr.h>
  4. #include <string.h>
  5.  
  6.  
  7. pascal void DNRResultProc(struct hostInfo *hInfoPtr, char *userDataPtr);
  8.  
  9. /*    ConvertStringToAddr is a simple call to get a host's IP number, given the name
  10.     of the host.
  11. */
  12.  
  13. void WaitForDone(char *done);
  14. integer MainEvents(integer evtMask);
  15. void RunBackground(void);
  16.  
  17. void WaitForDone(char *done)
  18. {
  19.     extern Boolean Quitable;
  20.     extern Boolean noMenus;
  21.     extern Boolean haveWaitEvnt;
  22.     extern RgnHandle cursRgn;
  23.     Boolean quit_back = Quitable;
  24.     EventRecord    event;
  25.  
  26.     noMenus = TRUE;
  27.     Quitable = FALSE;
  28.  
  29.     while (!(*done))
  30.         {
  31.         if ( !EventAvail(everyEvent, &event) )
  32.             {
  33.             if (haveWaitEvnt)
  34.                 WaitNextEvent(everyEvent, &event, GetCaretTime(), cursRgn);
  35.             else
  36.                 SystemTask();                                 /* run drivers    */
  37.             }
  38.         else
  39.             MainEvents(everyEvent);
  40.         RunBackground();
  41.         }
  42.     noMenus = FALSE;
  43.     Quitable = quit_back;
  44. }
  45.  
  46. OSErr ConvertStringToAddr(char *name, LongWord *netNum)
  47. {
  48.     struct hostInfo hInfo;
  49.     OSErr result;
  50.     Byte    *p = (Byte*)netNum;
  51.     integer    h1, h2, h3, h4;
  52.     char done = FALSE;
  53.     extern Boolean gCancel;
  54.  
  55.     if ((result = OpenResolver(NIL)) == noErr)
  56.         {
  57.         result = StrToAddr(name, &hInfo, DNRResultProc, &done);
  58.         if (result == cacheFault)
  59.             WaitForDone(&done); /* wait for cache fault resolver to be called by interrupt */
  60.         CloseResolver();
  61.         if ((hInfo.rtnCode == noErr) || (hInfo.rtnCode == cacheFault))
  62.             {
  63.             *netNum = hInfo.addr[0];
  64.             strcpy(name, hInfo.cname);
  65.             name[strlen(name)-1] = '\0';
  66.             return noErr;
  67.             }
  68.         }
  69.     else
  70.         {
  71.         if (sscanf(name, "%d.%d.%d.%d", &h1, &h2, &h3, &h4) == 4)
  72.             {
  73.             p[0] = h1; p[1] = h2; p[2] = h3; p[3] = h4;
  74.             return noErr;
  75.             }
  76.         }
  77.  
  78.     *netNum = 0;
  79.  
  80.     return result;
  81. }
  82.  
  83.  
  84. /*    This is the completion routine used for name-resolver calls.
  85.     It sets the userDataPtr flag to indicate the call has completed.
  86. */
  87.  
  88. pascal void DNRResultProc(struct hostInfo *hInfoPtr,char *userDataPtr)
  89. {
  90. #pragma unused (hInfoPtr)
  91.  
  92.     *userDataPtr = 0xff;    /* setting the use data to non-zero means we're done */
  93. }
  94.  
  95. OSErr ConvertAddrToString(char *name, unsigned long netNum)
  96. {
  97.     struct hostInfo hInfo;
  98.     OSErr result;
  99.     char done = FALSE;
  100.     Byte    *rh;
  101.     extern Boolean gCancel;
  102.  
  103.     if ((result = OpenResolver(NIL)) == noErr)
  104.         {
  105.         result = AddrToName(netNum, &hInfo, DNRResultProc, &done);
  106.         if (result == cacheFault)
  107.             WaitForDone(&done); /* wait for cache fault resolver to be called by interrupt */
  108.         CloseResolver();
  109.         result = hInfo.rtnCode;
  110.  
  111.         if ((hInfo.rtnCode == noErr) || (hInfo.rtnCode == cacheFault))
  112.             {
  113.             strcpy(name, hInfo.cname);
  114.             name[strlen(name)-1] = '\0';
  115.             return noErr;
  116.             }
  117.         }
  118.  
  119.     rh = (Byte*)&netNum;
  120.     sprintf(name, "%d.%d.%d.%d", rh[0], rh[1], rh[2], rh[3]);
  121.  
  122.     return result;
  123. }
  124.